/*
 * UsuarioBean.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.security;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.inject.Inject;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

import br.com.pma.chamatec.business.IUsuarioBO;
import br.com.pma.chamatec.dominio.PerfilUsuario;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.entity.Usuario;

/**
 * Classe de controle do usuário, sendo utilizada para manter os dados do usuário logado na sessão.
 * 
 * @author Ludemeula Fernandes de Sá
 */
@ManagedBean
@SessionScoped
public class UsuarioBean implements Serializable {
	private static final long serialVersionUID = 7092560241303747043L;

	@Inject
	private Usuario usuario;

	@Inject
	private IUsuarioBO usuarioBO;

	/**
	 * Inicializa o objeto usuario, buscando as informações após o login.
	 */
	public void init() {
		//Obtendo contexto do Spring
		SecurityContext context = SecurityContextHolder.getContext();
		if (context instanceof SecurityContext) {
			//Obtendo a autenticação realizada e o login do usuário logado
			Authentication authentication = context.getAuthentication();
			if (authentication instanceof Authentication) {
				//O principal só vai ser um User quando tiver sido realizada a autenticação. 
				if (authentication.getPrincipal() instanceof User) {
					Usuario usuarioPesquisa = new Usuario();
					usuarioPesquisa.setLogin(((User) authentication.getPrincipal()).getUsername());
					try {
						this.usuario = usuarioBO.recuperarPorLoginComPerfil(usuarioPesquisa);
					} catch (ChamatecNegocioException e) {
						e.printStackTrace();
					}
				} else if (authentication.getPrincipal() instanceof Usuario) {
					this.usuario = (Usuario) authentication.getPrincipal();
				}
			}
		}
	}

	/**
	 * @return the usuario
	 */
	public Usuario getUsuario() {
		if (usuario == null || usuario.getId() == null) {
			init();
		}
		return usuario;
	}

	/**
	 * @param usuario the usuario to set
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	/**
	 * Retorna se o usuário que está logado possui perfil ADMINISTRADOR.
	 * 
	 * @return
	 */
	public Boolean isAdministrador() {
		return 	getUsuario() != null && getUsuario().getPerfil() != null &&
				(getUsuario().getPerfil().getId().equals(PerfilUsuario.ADMINISTRADOR.getCodigo()));
	}

	/**
	 * Retorna se o usuário que está logado possui perfil GERENTE.
	 * 
	 * @return
	 */
	public Boolean isGerente() {
		return getUsuario() != null && getUsuario().getPerfil() != null &&
				(getUsuario().getPerfil().getId().equals(PerfilUsuario.GERENTE.getCodigo()));
	}

	/**
	 * Retorna se o usuário que está logado possui perfil TECNICO.
	 * 
	 * @return
	 */
	public Boolean isTecnico() {
		return getUsuario() != null && getUsuario().getPerfil() != null &&
				(getUsuario().getPerfil().getId().equals(PerfilUsuario.TECNICO.getCodigo()));
	}
	
	/**
	 * Retorna se o usuário que está logado possui perfil SERVIDOR.
	 * 
	 * @return
	 */
	public Boolean isServidor() {
		return getUsuario() != null && getUsuario().getPerfil() != null &&
				(getUsuario().getPerfil().getId().equals(PerfilUsuario.SERVIDOR.getCodigo()));
	}
}